package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.JButton;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

import java.util.List;
import java.util.Random;

import temporizador.Temporizador;
import vista.Mensaje;
import vista.VentanaPrincipal;
import modelo.Frase;
import modelo.FraseDao;
import modelo.Nivel;
import modelo.NivelDao;
import modelo.Jugador;
import modelo.JugadorDao;

public class ControladorPrincipal implements ActionListener,KeyListener{

	private VentanaPrincipal ventanaPrincipal;
	
	private Frase frase;
	private Nivel nivel;
	private int numCaracteresPorRevelar;
	private Temporizador temporizador;
	
	public ControladorPrincipal(){
	     ventanaPrincipal= new VentanaPrincipal();
	     temporizador= new Temporizador();
	     temporizador.addObserver(ventanaPrincipal.getLabelTemporizador());
	     frase=null;
	     nivel=null;
	     numCaracteresPorRevelar=0;
	     
	     ventanaPrincipal.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
		 ventanaPrincipal.setLocationRelativeTo(null);
		 ventanaPrincipal.setResizable(false);
		 
		 ventanaPrincipal.addListener((ActionListener)this);
		 ventanaPrincipal.addListener((KeyListener)this);
		 
		 ventanaPrincipal.setVisible(true);
	     
		 seleccionarNuevaPartida();
	     
	     
	}
	
	public void visualizarVentanaPrincipal(){
		ventanaPrincipal.setVisible(true);
	}
	
	private void seleccionarNuevaPartida(){
		temporizador.parar();
		temporizador.setHoras(0);
		temporizador.setMinutos(0);
		temporizador.setSegundos(0);
		
		ventanaPrincipal.ocultarVistaJuego();
		ventanaPrincipal.mostrarVistaInicial();
	}
	
	private void iniciarNuevaPartida(){
		temporizador.reiniciar();
		ventanaPrincipal.ocultarVistaInicial();
		ventanaPrincipal.mostrarVistaJuego();
		ventanaPrincipal.habilitarBotones();
	}
	
	
	private void probarLetra(char letra){
		if (frase!=null && ventanaPrincipal.isBotonHabilitado(letra)){
			if (frase.getOracion().contains(String.valueOf(letra))){
				ventanaPrincipal.mostrarCaracter(frase.getOracion(), letra);
				actualizarCaracteresPorRevelar(letra);
				/*Verifica si el Jugador gano*/
				if (numCaracteresPorRevelar <= 0)
				{
					temporizador.parar();
					Mensaje.mostrarInformacion("HAS GANADO!!!");
				
					
					Jugador jugadorGano= new Jugador();
				    jugadorGano.setEquivocaciones(ventanaPrincipal.obtenerMaxVida() - ventanaPrincipal.obtenerVida());
				    jugadorGano.setTiempo(ventanaPrincipal.obtenerTiempo());
				    jugadorGano.setNivel(nivel);
				    jugadorGano.setPuntaje(jugadorGano.calcularPuntaje());
								
					try{
						JugadorDao jugadorDao= new JugadorDao();
						 List<Jugador> listaJugadores= jugadorDao.getMejoresJugadores(nivel);
						 
						if (listaJugadores.isEmpty() || listaJugadores.size() < Jugador.MAX_NUM_JUGADORES){
							String nombre= Mensaje.mostrarMensajeEntrada("Felicitaciones has roto un Record!!!" + System.getProperty("line.separator") + "Introduzca su Nombre:");
							
							if (nombre==null || nombre.isEmpty())
								nombre= "Anonimo";
							
							jugadorGano.setNombre(nombre);
							
							   if (!jugadorDao.insertarJugador(jugadorGano)) 
								   Mensaje.mostrarError("Error Actualizando Mejores Puntuaciones!!!");
						}
						else
						{
                            
							Jugador peorJugador= jugadorDao.peorJugadorNivel(nivel);
							
						    if (jugadorGano.getPuntaje()<peorJugador.getPuntaje()){
						    	
						    	String nombre= Mensaje.mostrarMensajeEntrada("Felicitaciones has roto un Record!!!" + System.getProperty("line.separator") + "Introduzca su Nombre:");
						
						    	
								if (nombre==null || nombre.isEmpty())
									nombre= "Anonimo";
								
								jugadorGano.setNombre(nombre); 	
						    	jugadorGano.setCodigo(peorJugador.getCodigo());
						    	
	                           if (!jugadorDao.actualizarJugador(jugadorGano))
	                        	   Mensaje.mostrarError("Error Actualizando Mejores Puntuaciones!!!");
					        } 
					    }
					}
					catch(Exception e)
					{
						Mensaje.mostrarError(e.getMessage());
					}
					
				    /******/
					/*Si desea Jugar de Nuevo*/
					if (Mensaje.mostrarConfirmacion("Deseas Seguir Jugando?")){
						seleccionarNuevaPartida();
					}
					else{
						ventanaPrincipal.setVisible(false);
						ventanaPrincipal.dispose();
						System.exit(0);
					}
					/***/
				}		
				/**/
			}
			else{
				ventanaPrincipal.decrementarVida();
				if (ventanaPrincipal.obtenerVida()==0){
					temporizador.parar();
					if (Mensaje.mostrarConfirmacion("HAS PERDIDO!!!" + System.getProperty("line.separator") + "La Frase era \"" + frase.getOracion() + "\"" + System.getProperty("line.separator") + "Deseas Seguir Jugando?")){			
						seleccionarNuevaPartida();
					}
					else{
						ventanaPrincipal.setVisible(false);
						ventanaPrincipal.dispose();
						System.exit(0);
					}
				}
			}
			
			ventanaPrincipal.deshabilitarBoton(letra);
		}
	}

	private void actualizarCaracteresPorRevelar(char caracter){
		char[] caracteresFrase= frase.getOracion().toCharArray();
		
		for (char c:caracteresFrase){
			if (caracter==c)
				--numCaracteresPorRevelar;
		}
	}
	
	private void calcularCaracteresPorRevelar(){
		char[] caracteresFrase= frase.getOracion().toCharArray();
		numCaracteresPorRevelar=0;
		
		for (char c:caracteresFrase){
			if (Character.isLetter(c))
				++numCaracteresPorRevelar;
		}
	}
	
	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof JButton){
			JButton boton= (JButton) e.getSource();
			if (boton.getActionCommand().equalsIgnoreCase("Iniciar Juego")){
				
				try{
				  nivel= new NivelDao().getNivel(ventanaPrincipal.obtenerNivelCombo());
				  
				  List<Frase> frases= new FraseDao().getFrases(nivel);
				  
				  Random aleatorio= new Random();
				  
				  frase = frases.get(aleatorio.nextInt(frases.size()));
				  
				  calcularCaracteresPorRevelar();
				  
				  ventanaPrincipal.asignarFrase(frase.getOracion());
				  ventanaPrincipal.asignarNivel(nivel.getDescripcion());
				  iniciarNuevaPartida();
				  
				}
				catch(Exception ex){
					frase=null;
					numCaracteresPorRevelar=0;
					Mensaje.mostrarError(ex.getMessage());
				}
			}
			else{ //Botones de las letras
				probarLetra(boton.getActionCommand().charAt(0));
				
			}
		}
		else
		{
			if (e.getSource() instanceof JMenuItem){
				JMenuItem menuItem= (JMenuItem)e.getSource();
				if (menuItem.getActionCommand().equalsIgnoreCase("Nuevo Juego")){
					seleccionarNuevaPartida();
				}
				else if (menuItem.getActionCommand().equalsIgnoreCase("Primeras Puntuaciones")){
					   ventanaPrincipal.setVisible(false);
		               ControladorVentanaListadoJugador vListado = new ControladorVentanaListadoJugador(this);				
				}
				else if (menuItem.getActionCommand().equalsIgnoreCase("Salir")){
					ventanaPrincipal.setVisible(false);
					ventanaPrincipal.dispose();
					System.exit(0);
				}
				else if (menuItem.getActionCommand().equalsIgnoreCase("Agregar Frase")){
					ventanaPrincipal.setVisible(false);
					ControladorVentanaFrase vFrase= new ControladorVentanaFrase(this);
					
				}
			}
		}
		
	}

	@Override
	public void keyTyped(KeyEvent e) {
		probarLetra(Character.toUpperCase(e.getKeyChar()));
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub
	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub
	}

	
}
